﻿Imports WSEntidades
Imports Utilerias
Imports WSDatos
Imports System.Transactions

Public Class CuentasBL

    Public Function RegistrarCuenta(ByVal cuenta As CatCuentasBE,
                                    ByRef detResp As DetalleRespuesta) As Boolean
        Dim boolCuentaRegistrada As Boolean = True
        If (EsValidoParaRegistrar(cuenta, detResp.Mensajes)) Then
            Dim CuentaDAL As New CatCuentasDAL()
            Dim mailBL As EnviosDeCorreoBL = New EnviosDeCorreoBL()
            Dim servBL As ServidoresBL = New ServidoresBL()
            Dim servBE As New CatServidoresBE()
            Dim strContraseñaUsuario As String = ""
            Try
                If (CuentaDAL.existeCuenta(cuenta.Rfc)) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_PreviamenteRegistrado,
                                             String.Format("Existe un registro con el RFC indicado <{0}>", cuenta.Rfc))
                    Return False
                Else
                    servBE = servBL.obtenServidorDisponible()
                    If (servBE Is Nothing) Then
                        detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueRegistrado,
                                                "No se encontro un Servidor disponible para la creación de la Cuenta")
                        Return False
                    End If
                    cuenta.Status = CatCuentasBE.EstatusCuenta.Activa
                    cuenta.IdServidor = servBE.Id
                    cuenta.NombreBd = "sifei_" & cuenta.Rfc
                    'Manejo de caracteres especiales
                    cuenta.NombreBd = cuenta.NombreBd.Replace("&", "38")
                    cuenta.NombreBd = cuenta.NombreBd.Replace("Ñ", "164")

                    Using transacCta As TransactionScope = New TransactionScope()
                        If (CuentaDAL.registraCatCuentas(cuenta)) Then
                            If (servBL.consumeDisponibleBDEnServidor(servBE.Id)) Then
                                transacCta.Complete()
                                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK, "")
                                boolCuentaRegistrada = True
                            Else
                                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueRegistrado,
                                                         "No fue posible consumir disponible en Servidor")
                                boolCuentaRegistrada = False
                            End If
                        Else
                            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueRegistrado,
                                                     "No fue posible registrar la Cuenta en Sistema.")
                            boolCuentaRegistrada = False
                        End If
                    End Using

                    If (boolCuentaRegistrada) Then
                        If (CuentaDAL.creaBDUsuario(cuenta.NombreBd, cuenta.Rfc, cuenta.Nombre, cuenta.Correo, servBE, strContraseñaUsuario, cuenta.Telefono)) Then
                            mailBL.enviaMailCreacionCuenta(cuenta.Rfc, cuenta.Nombre, "Administrador", strContraseñaUsuario, cuenta.Correo)
                            Return True
                        Else
                            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Cuenta_RegistradaNoSeCreoBD,
                                                     "No se creó la BD del cliente, favor de contactar a Soporte Técnico")
                            Return False
                        End If
                    Else
                        Return False
                    End If
                End If
            Catch ex As Exception
                Log.LogException(ex, "CuentasBL.RegistrarCuenta")
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                         detResp.Mensajes & "Excepción al registrar cuenta: " & ex.Message)
                Return False
            Finally
                CuentaDAL = Nothing
                mailBL = Nothing
                servBE = Nothing
                servBL = Nothing
                strContraseñaUsuario = Nothing
            End Try
        Else
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                     "La cuenta no es valida para registrar: " & vbCrLf & detResp.Mensajes)
            Return False
        End If
    End Function

    Public Function ActualizaDatosEmpresa(ByVal empresa As empresaBE, ByRef mensaje As String) As Boolean
        If (EsValidoParaActualizar(empresa, mensaje)) Then
            Dim CuentaDAL As New CatCuentasDAL()
            Try
                If (CuentaDAL.actualizaCatCuentas(empresa)) Then
                    Return True
                Else
                    mensaje &= "No se pudo actualizar datos generales de la Empresa, favor de contactar a Soporte Sifei." & vbCrLf
                    Return False
                End If
            Catch ex As Exception
                Log.LogException(ex, "CuentasBL.ActualizaDatosEmpresa")
                mensaje &= "Error al actualizar datos generales de la Empresa: " & ex.Message
                Return False
            Finally
                CuentaDAL = Nothing
            End Try
        Else
            mensaje = "No se tienen datos validos para Actualizar datos generales." & vbCrLf & mensaje
            Return False
        End If
    End Function

    Private Function EsValidoParaActualizar(ByVal empresa As empresaBE, ByRef mensaje As String) As Boolean
        mensaje = ""
        Try
            If (String.IsNullOrWhiteSpace(empresa.RFC)) Then
                mensaje &= "El RFC es obligatorio" & vbCrLf
            Else
                empresa.RFC = empresa.RFC.Trim.ToUpper

                Select Case empresa.RFC.Length
                    Case 12
                        If (Not (csValidaciones.esRFCValidoPersonaMoral(empresa.RFC))) Then
                            mensaje &= String.Format("RFC <{0}> no válido para Persona Moral", empresa.RFC) & vbCrLf
                        End If

                    Case 13
                        If (Not (csValidaciones.esRFCValidoPersonaFisica(empresa.RFC))) Then
                            mensaje &= String.Format("RFC <{0}> no válido para Persona Física", empresa.RFC) & vbCrLf
                        End If

                    Case Else
                        mensaje &= String.Format("Longitud de RFC no válida (<{0}>)", empresa.RFC) & vbCrLf
                End Select
            End If

            If (String.IsNullOrWhiteSpace(empresa.RazonSocial)) Then
                mensaje &= "La Razón Social del Contribuyente es obligatoria" & vbCrLf
            Else
            End If

            If (String.IsNullOrWhiteSpace(empresa.Correo)) Then
                mensaje &= "El Correo Electrónico es obligatorio" & vbCrLf
            Else
                If (Not (csValidaciones.esCorreoValido(empresa.Correo))) Then
                    mensaje &= String.Format("Dirección de Correo Electrónico <{0}> no válido", empresa.Correo) & vbCrLf
                End If
            End If

            If (String.IsNullOrWhiteSpace(empresa.Telefono)) Then
                mensaje &= "El Teléfono es obligatorio" & vbCrLf
            End If

            If (mensaje = "") Then
                Return True
            Else
                Return False
            End If

        Catch ex As Exception
            Log.LogException(ex, "CuentasBL.EsValidoParaRegistrar")
            mensaje = ex.Message
            Return False
        End Try
    End Function

    Private Function EsValidoParaRegistrar(ByRef pCuenta As CatCuentasBE, ByRef mensaje As String) As Boolean
        mensaje = ""
        Try
            If (String.IsNullOrWhiteSpace(pCuenta.Rfc)) Then
                mensaje &= "El RFC es obligatorio" & vbCrLf
            Else
                pCuenta.Rfc = pCuenta.Rfc.Trim.ToUpper

                Select Case pCuenta.Rfc.Length
                    Case 12
                        If (Not (csValidaciones.esRFCValidoPersonaMoral(pCuenta.Rfc))) Then
                            mensaje &= String.Format("RFC <{0}> no válido para Persona Moral", pCuenta.Rfc) & vbCrLf
                        End If

                    Case 13
                        If (Not (csValidaciones.esRFCValidoPersonaFisica(pCuenta.Rfc))) Then
                            mensaje &= String.Format("RFC <{0}> no válido para Persona Física", pCuenta.Rfc) & vbCrLf
                        End If

                    Case Else
                        mensaje &= String.Format("Longitud de RFC no válida (<{0}>)", pCuenta.Rfc) & vbCrLf
                End Select
            End If

            If (String.IsNullOrWhiteSpace(pCuenta.Nombre)) Then
                mensaje &= "El Nombre del Contribuyente es obligatorio" & vbCrLf
            Else
                pCuenta.Nombre = pCuenta.Nombre.Trim
                If (pCuenta.Nombre.Length > 255) Then
                    pCuenta.Nombre = pCuenta.Nombre.Substring(0, 255)
                End If
            End If

            If (String.IsNullOrWhiteSpace(pCuenta.Correo)) Then
                mensaje &= "El Correo Electrónico es obligatorio" & vbCrLf
            Else
                pCuenta.Correo = pCuenta.Correo.Trim
                If (pCuenta.Correo.Length > 255) Then
                    pCuenta.Correo = pCuenta.Correo.Substring(0, 255)
                End If
                If (Not (csValidaciones.esCorreoValido(pCuenta.Correo))) Then
                    mensaje &= String.Format("Dirección de Correo Electrónico <{0}> no válido", pCuenta.Correo) & vbCrLf
                End If
            End If

            If (String.IsNullOrWhiteSpace(pCuenta.Telefono)) Then
                mensaje &= "El Teléfono es obligatorio" & vbCrLf
            Else
                pCuenta.Correo = pCuenta.Correo.Trim
                If (pCuenta.Correo.Length > 30) Then
                    pCuenta.Correo = pCuenta.Correo.Substring(0, 30)
                End If
            End If

            If (mensaje = "") Then
                Return True
            Else
                Return False
            End If

        Catch ex As Exception
            Log.LogException(ex, "CuentasBL.EsValidoParaRegistrar")
            mensaje = ex.Message
            Return False
        End Try
    End Function

    Public Function GenerarCadenaConexionClienteActivo(ByVal pRFC As String, ByRef mensajes As String) As String
        Dim cuentasDAL As CatCuentasDAL = New CatCuentasDAL()
        Try
            Return cuentasDAL.getCadenaConexionCliente(pRFC, CatCuentasBE.EstatusCuenta.Activa)
        Catch ex As Exception
            mensajes &= "Ocurrió un error al buscar datos del Cliente" & vbCrLf & ex.Message & vbCrLf
            Log.LogException(ex, "CuentasBL.GenerarCadenaConexionClienteActivo")
            Return ""
        Finally
            cuentasDAL = Nothing
        End Try
    End Function
End Class
